<?php
// 认证相关常量
define('MAX_LOGIN_ATTEMPTS', 5);     // 最大尝试次数
define('LOCK_TIME_MINUTES', 30);     // 锁定时间（分钟）
define('LOGIN_DATA_FILE', 'login_attempts.json'); // 保存登录尝试的文件

// 用户凭据（在实际应用中应该使用数据库或更安全的存储方式）
$valid_credentials = [
    'admin' => 'password123'  // 用户名 => 密码
];

/**
 * 检查会话是否已登录
 */
function isLoggedIn() {
    return isset($_SESSION['logged_in']) && $_SESSION['logged_in'] === true;
}

/**
 * 尝试登录
 * 
 * @param string $username 用户名
 * @param string $password 密码
 * @return bool|string 成功返回true，失败返回错误消息
 */
function attemptLogin($username, $password) {
    global $valid_credentials;
    
    // 检查账户是否被锁定
    $lock_status = checkLockStatus();
    if ($lock_status !== false) {
        return "由于多次登录失败，账户已被锁定。请在 {$lock_status} 分钟后再试。";
    }
    
    // 验证凭据
    if (isset($valid_credentials[$username]) && $valid_credentials[$username] === $password) {
        // 登录成功，重置尝试记录
        resetLoginAttempts();
        return true;
    } else {
        // 登录失败，记录失败尝试
        recordFailedAttempt();
        $attempts = getRemainingAttempts();
        if ($attempts > 0) {
            return "用户名或密码错误，还剩 {$attempts} 次尝试机会。";
        } else {
            return "由于多次登录失败，账户已被锁定 " . LOCK_TIME_MINUTES . " 分钟。";
        }
    }
}

/**
 * 检查账户是否被锁定
 * 
 * @return false|int 如果被锁定返回剩余分钟数，否则返回false
 */
function checkLockStatus() {
    $attempts_data = getAttemptsData();
    
    if ($attempts_data['failed_attempts'] >= MAX_LOGIN_ATTEMPTS) {
        $lock_time = $attempts_data['last_attempt_time'] + (LOCK_TIME_MINUTES * 60);
        $current_time = time();
        
        if ($current_time < $lock_time) {
            // 计算剩余锁定时间（分钟）
            $remaining_minutes = ceil(($lock_time - $current_time) / 60);
            return $remaining_minutes;
        } else {
            // 锁定期已过，重置尝试记录
            resetLoginAttempts();
            return false;
        }
    }
    
    return false;
}

/**
 * 获取剩余尝试次数
 * 
 * @return int 剩余尝试次数
 */
function getRemainingAttempts() {
    $attempts_data = getAttemptsData();
    return max(0, MAX_LOGIN_ATTEMPTS - $attempts_data['failed_attempts']);
}

/**
 * 记录失败的登录尝试
 */
function recordFailedAttempt() {
    $attempts_data = getAttemptsData();
    $attempts_data['failed_attempts']++;
    $attempts_data['last_attempt_time'] = time();
    saveAttemptsData($attempts_data);
}

/**
 * 重置登录尝试记录
 */
function resetLoginAttempts() {
    $attempts_data = [
        'failed_attempts' => 0,
        'last_attempt_time' => 0
    ];
    saveAttemptsData($attempts_data);
}

/**
 * 获取当前登录尝试数据
 * 
 * @return array 尝试数据
 */
function getAttemptsData() {
    if (file_exists(LOGIN_DATA_FILE)) {
        $data = json_decode(file_get_contents(LOGIN_DATA_FILE), true);
        if ($data !== null) {
            return $data;
        }
    }
    
    // 默认数据
    return [
        'failed_attempts' => 0,
        'last_attempt_time' => 0
    ];
}

/**
 * 保存登录尝试数据
 * 
 * @param array $data 要保存的数据
 */
function saveAttemptsData($data) {
    file_put_contents(LOGIN_DATA_FILE, json_encode($data));
}

/**
 * 登出用户
 */
function logout() {
    // 清除所有会话变量
    $_SESSION = [];
    
    // 如果需要，销毁会话cookie
    if (ini_get("session.use_cookies")) {
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
            $params["path"], $params["domain"],
            $params["secure"], $params["httponly"]
        );
    }
    
    // 销毁会话
    session_destroy();
}
